// JavaScript Document// holds an instance of XMLHttpRequest 
var xmlHttp = createXmlHttpRequestObject(); 
// holds the remote server address and parameters 
var serverAddress = "friendly.php?action=GetNews"; 
// variables that establish how often to access the server  
var updateInterval = 5; // how many seconds to wait to get new message 
var errorRetryInterval = 30; // seconds to wait after server error 
// when set to true, display detailed error messages 
var debugMode = true; 
 // creates an XMLHttpRequest instance 
function createXmlHttpRequestObject()  
{ 
  // will store the reference to the XMLHttpRequest object 
  var xmlHttp; 
  // this should work for all browsers except IE6 and older 
  try 
  { 
    // try to create XMLHttpRequest object 
    xmlHttp = new XMLHttpRequest(); 
  } 
  catch(e) 
  { 
    // assume IE6 or older 
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", 
                                    "MSXML2.XMLHTTP.5.0", 
                                    "MSXML2.XMLHTTP.4.0", 
                                    "MSXML2.XMLHTTP.3.0", 
                                    "MSXML2.XMLHTTP", 
                                    "Microsoft.XMLHTTP"); 
    // try every prog id until one works 
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)  
    { 
      try  
      {  
        // try to create XMLHttpRequest object 
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]); 
      }  
      catch (e) {} 
    } 
  } 
  // return the created object or display an error message 
  if (!xmlHttp) 
    alert("Error creating the XMLHttpRequest object."); 
  else  
    return xmlHttp; 
} 
 
// function that displays a new message on the page 
function display($message) 
{ 
  // obtain a reference to the <div> element on the page 
  myDiv = document.getElementById("myDivElement"); 
  // display message 
  myDiv.innerHTML = $message + "<br/>"; 
} 
 
// function that displays an error message 
function displayError($message) 
{ 
  // display error message, with more technical details if debugMode is true 
  display("Error retrieving the news message! Will retry in " + 
          errorRetryInterval + " seconds." +  
          (debugMode ? "<br/>" + $message : "")); 
  // restart sequence  
  setTimeout("process();", errorRetryInterval * 1000); 
} 
 
// call server asynchronously 
function process() 
{ 
  // only continue if xmlHttp isn't void 
  if (xmlHttp) 
  {     // try to connect to the server 
    try 
    { 
      // remove this line if you don't like the 'Receiving...' message 
      display("Receiving new message from server...") 
      // make asynchronous HTTP request to retrieve new message 
      xmlHttp.open("GET", serverAddress, true); 
      xmlHttp.onreadystatechange = handleGettingNews; 
      xmlHttp.send(null); 
    } 
    catch(e) 
    { 
      displayError(e.toString()); 
    } 
  } 
} 
 
// function called when the state of the HTTP request changes 
function handleGettingNews()  
{ 
  // when readyState is 4, we are ready to read the server response 
  if (xmlHttp.readyState == 4)  
  { 
    // continue only if HTTP status is "OK" 
    if (xmlHttp.status == 200)  
    { 
      try 
      { 
        // do something with the response from the server 
        getNews(); 
      } 
      catch(e) 
      { 
        // display error message 
        displayError(e.toString()); 
      } 
    }  
    else 
    { 
      // display error message 
      displayError(xmlHttp.statusText);    
    } 
  } 
} 
 
// handles the response received from the server 
function getNews() 
{ 
  // retrieve the server's response  
  var response = xmlHttp.responseText; 
  // server error? 
  if (response.indexOf("ERRNO") >= 0  
      || response.indexOf("error") >= 0 
      || response.length == 0) 
    throw(response.length == 0 ? "Server error." : response); 
  // display the message 
  display(response); 
  // restart sequence 
  setTimeout("process();", updateInterval * 1000); 
} 